﻿/**
 * @file Message.hpp
 * @brief SSD仿真系统IPC消息结构体定义，支持消息传递与响应。
 */
#pragma once
#ifndef __Message_h__
#define __Message_h__

#include <chrono>
#include <boost/interprocess/managed_shared_memory.hpp>
#include "BasicTypes.h"

/**
 * @typedef MessageId
 * @brief 消息ID类型。
 */
typedef U32 MessageId;

/**
 * @struct Message
 * @brief IPC消息结构体模板，包含数据、载荷及响应相关信息。
 * @tparam TData 消息数据类型
 */
template <typename TData>
struct Message
{
public:
    /**
     * @brief 判断消息是否需要响应。
     * @return 是否需要响应
     */
    bool ExpectsResponse() { return _ExpectsResponse; }
    /**
     * @brief 获取消息ID。
     * @return 消息ID
     */
    MessageId Id() { return _Id; }

public:
    TData Data;      /**< 消息数据体 */
    void *Payload;   /**< 消息载荷指针 */
    U32 PayloadSize; /**< 消息载荷大小 */

public:
    /**
     * @brief 获取消息响应延迟。
     * @return 响应延迟（秒）
     */
    std::chrono::duration<double> GetLatency()
    {
        return std::chrono::duration_cast<std::chrono::duration<double>>(_ResponseTime - _SubmitTime);
    }

private:
    boost::interprocess::managed_shared_memory::handle_t _PayloadHandle; /**< 载荷句柄 */
    MessageId _Id;                                                       /**< 消息ID */
    bool _ExpectsResponse;                                               /**< 是否需要响应 */

    std::chrono::high_resolution_clock::time_point _SubmitTime;   /**< 消息提交时间 */
    std::chrono::high_resolution_clock::time_point _ResponseTime; /**< 消息响应时间 */

    template <typename TData>
    friend class MessageBaseService; /**< 允许服务类访问私有成员 */
    template <typename TData>
    friend class MessageClient; /**< 允许客户端访问私有成员 */
    template <typename TData>
    friend class MessageServer; /**< 允许服务器访问私有成员 */
};

#endif